import { ChatPromptTemplate } from '@langchain/core/prompts';
import { ChatOpenAI } from '@langchain/openai';
import { McpServer } from './McpServer';
import { createReactAgent } from '@langchain/langgraph/prebuilt';
import { MemorySaver } from '@langchain/langgraph';

// 创建模型的工厂函数，支持动态配置
export const createModel = (config?: {
  temperature?: number;
  maxTokens?: number;
  model?: string;
  streaming?: boolean;
}) => {
  return new ChatOpenAI({
    verbose: false, // 关闭详细日志以提高性能
    /**
     * 模型推导度
     */
    temperature: config?.temperature ?? 0.7,

    /**
     * 模型最大token数
     */
    maxTokens: config?.maxTokens ?? 8000, // 限制token数量以控制成本

    /**
     * 模型名称
     * @defaultValue 'gpt-3.5-turbo'
     */
    model: config?.model ?? 'deepseek-ai/DeepSeek-V3.1-Terminus',

    /**
     * 配置
     */
    configuration: {
      /**
       * 密钥
       */
      apiKey: 'sk-sssdueysiwnoinzwqvtwhbwzdniszusgvprzrcaavppoocnb',

      /**
       * 基础URL

       */
      baseURL: 'https://api.siliconflow.cn/v1/',
    },

    /**
     * 启用流式响应
     */
    streaming: config?.streaming ?? false,
  });
};

// 默认模型实例（保持向后兼容）
const model = createModel();

// const prompt = ChatPromptTemplate.fromTemplate(`
//       回答用户的问题,
//       1. 你是一个gis开发专家,精通各种gis开发技术
//       2. 请简洁和专业的回答用户的问题,并给出每个字段的解释
//       3. 如果你不知道答案,请说你不知道,不要编造答案,使用json格式回答
//       4. 请用中文回答
//       context: {context}
//       input: {input}`);
// const chain = prompt.pipe(model);

// 创建单例的 MemorySaver 实例以确保内存一致性
let memorySaver: MemorySaver | null = null;

const getMemorySaver = () => {
  if (!memorySaver) {
    memorySaver = new MemorySaver();
  }
  return memorySaver;
};

// 缓存 agent 实例以提高性能
let agentInstance: ReturnType<typeof createReactAgent> | null = null;

// 获取默认 agent（保持向后兼容）
const getAgent = async () => {
  if (agentInstance) {
    return agentInstance;
  }

  const tools = await McpServer.getTools();

  agentInstance = createReactAgent({
    llm: model,
    tools: tools || [], // 确保 tools 不为 undefined
    checkpointSaver: getMemorySaver(),
    // 添加状态修改器以更好地处理对话历史
    // stateModifier: (state) => {
    //   // 保持最近的20条消息以避免上下文过长
    //   if (state.messages && state.messages.length > 20) {
    //     const systemMessages = state.messages.filter(
    //       (msg) => msg.type === 'system',
    //     );
    //     const recentMessages = state.messages.slice(-18); // 保留最近18条非系统消息
    //     state.messages = [...systemMessages, ...recentMessages];
    //   }
    //   return state;
    // },
  });

  return agentInstance;
};

// 获取带配置的 agent
export const getAgentWithConfig = async (config?: {
  temperature?: number;
  maxTokens?: number;
  model?: string;
  streaming?: boolean;
}) => {
  const dynamicModel = createModel(config);
  const tools = await McpServer.getTools();

  return createReactAgent({
    llm: dynamicModel,
    tools: tools || [],
    checkpointSaver: getMemorySaver(),
  });
};

// 重置 agent 实例的方法（用于开发调试）
const resetAgent = () => {
  agentInstance = null;
  memorySaver = null;
};

export { model, getAgent, resetAgent, getMemorySaver };
